package bo;

import IBO.IEmploye;
import IBO.IRole;
import dao.dto.AdresseDto;
import dao.dto.EmployeDto;
import dao.dto.RoleDto;
import boerrors.AdresseMinimumMultiplicityException;
import boerrors.CodePostalMinimumMultiplicityException;
import boerrors.RoleMinimumMultiplicityException;
import boerrors.ZoneMinimumMultiplicityException;
import dao.AbstractFactory;
import java.rmi.RemoteException;
import util.Util;

public abstract class Employe extends Personne implements IEmploye, Cloneable{
        private int _matricule;
        private Role _role;
        private String _fonction;
        private String _password;

	//*******************************************************************
	//Constructeurs
	//*******************************************************************
        public Employe( String nom, String prenom, Adresse adresse, 
                        String telephone, String email, Role role, 
                        String fonction, String password) throws RemoteException {
                super(nom, prenom, adresse, telephone, email);
                enregistrerRole(role);
                setFonction(fonction);
                setPassword(password);

        }

        //Contructeur partiel utilisé par Technicien(TechnicienDto)
        public Employe( int matricule, String nom, String prenom, 
                        String telephone, String email,
                        String fonction, String password) throws RemoteException {
                super(nom, prenom, telephone, email);
                setFonction(fonction);
                setMatricule(matricule);
                setPassword(password);
        }        
        
        public Employe( int matricule, String nom, String prenom, 
                        Adresse adresse, String telephone, String email, Role role,
                        String fonction, String password) throws RemoteException {
                super(nom, prenom, adresse, telephone, email);
                enregistrerRole(role);
                setFonction(fonction);
                setMatricule(matricule);
                setPassword(password);
        }
  
        //Convertir bo - dto
        public EmployeDto creerEmployeDto() throws  RemoteException, RoleMinimumMultiplicityException, 
                                                    AdresseMinimumMultiplicityException, 
                                                    CodePostalMinimumMultiplicityException, 
                                                    ZoneMinimumMultiplicityException {
                AdresseDto adresse = this.getAdresse().creerAdresseDto();
                RoleDto role = this.getRole().creerRoleDto();
                return new EmployeDto(  this.getMatricule(), this.getNom(), this.getPrenom(), 
                                        adresse, this.getTelephone(), this.getEmail(),
                                        this.getFonction(), this.getPassword(), role);
        }

	//*******************************************************************
	//Setters
	//*******************************************************************
        
        public synchronized void setMatricule(int matricule) {
                Util.checkPositive(matricule);
                this._matricule = matricule;
        }

        public synchronized void setFonction(String fonction) {
                Util.checkString(fonction);
                this._fonction = fonction;
        }

        public synchronized void setPassword(String password) {
                //Util.checkString(password);
                this._password = password;
        }

	//*******************************************************************
	//Getters
	//*******************************************************************
        
        public synchronized int getMatricule() throws RemoteException {
                return _matricule;
        }

        public synchronized String getFonction() throws RemoteException {
                return _fonction;
        }

        public synchronized Role getRole() throws RemoteException, RoleMinimumMultiplicityException {
                if (! aUnRoleValide()) throw new RoleMinimumMultiplicityException();
		return _role;
        }

        public synchronized IRole getIRole() throws RemoteException, RoleMinimumMultiplicityException {
                if (! aUnRoleValide()) throw new RoleMinimumMultiplicityException();
		return _role;
        }        
        
        public synchronized String getPassword() throws RemoteException {
                return _password;
        }
 
	//*******************************************************************
	//Associations
	//*******************************************************************
        
        public synchronized boolean enregistrerRoleClone(Role Role) {
                if (this._role == Role) return false;
		this._role = Role;
		return true;
	}

        public synchronized boolean enregistrerRole(Role Role) {
                if (this._role == Role) return false;
		if (! peutEnregistrerRole()) return false;
		this._role = Role;
		return true;
	}

        //Aucune suppression de la Role n'est autorisée

        private synchronized boolean peutEnregistrerRole() {
                return this._role == null;
	}
        
        public synchronized boolean aUnRoleValide() {
                return this._role != null;
        }
        
	//*******************************************************************
	//Method Clonable
	//*******************************************************************        
        
        @Override
        public Object clone(){
            // On recupere l'instance à renvoyer par l'appel de la 
	    // méthode super.clone() (ici : Personne.clone())
             Employe employe = (Employe) super.clone();
             employe._role = (Role) _role.clone();
            // on renvoie le clone
            return employe;
        }      
}